// data example: v=-4.8 km/h, str=655
// 判断 v 不等于 0.0 或者 0
pub fn parse_cem5826m11_data(data: &[u8]) -> f32 {
    if data.len() < 6 {
        return 0.0;
    }
    if data[0] != b'v' || data[1] != b'=' {
        return 0.0;
    }

    let data_str = match core::str::from_utf8(data) {
        Ok(s) => s,
        Err(_) => return 0.0,
    };

    let v_part = match data_str.find(',') {
        Some(pos) => &data_str[..pos],
        None => data_str,
    };

    if let Some(eq_pos) = v_part.find('=') {
        let value_str = &v_part[(eq_pos + 1)..].trim();
        if let Some(space_pos) = value_str.find(' ') {
            if let Ok(v_value) = value_str[..space_pos].parse::<f32>() {
                return v_value;
            }
        } else {
            if let Ok(v_value) = value_str.parse::<f32>() {
                return v_value;
            }
        }
    }

    0.0
}

// run cmd
//  cd /workspace && RUST_BACKTRACE=1 rustc --test app/src/utils.rs -o utils_test && ./utils_test
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_parse_cem5826m11_data() {
        // 测试正常情况：速度不为0
        let data1 = b"v=5.0 km/h, str=655";
        assert_eq!(parse_cem5826m11_data(data1), true);

        // 测试负速度情况：速度不为0
        let data2 = b"v=-4.8 km/h, str=655";
        assert_eq!(parse_cem5826m11_data(data2), true);

        // 测试速度为0的情况
        let data3 = b"v=0.0 km/h, str=655";
        assert_eq!(parse_cem5826m11_data(data3), false);

        // 测试只有速度部分的情况
        let data4 = b"v=3.2 km/h";
        assert_eq!(parse_cem5826m11_data(data4), true);

        // 测试数据太短的情况
        let data5 = b"v=";
        assert_eq!(parse_cem5826m11_data(data5), false);

        // 测试非v开头的情况
        let data6 = b"s=5.0 km/h, str=655";
        assert_eq!(parse_cem5826m11_data(data6), false);
    }
}
